1
ไปไกลกว่าการดำเนินการแบบองค์ประกอบเดียว: การเปลี่ยนไปใช้การดำเนินการแมทริกซ์แบบแบ่งเป็นช่อง
AI023Lesson 9
00:00

ในบทเรียนก่อนหน้า เราได้เน้นไปที่ การดำเนินการแบบองค์ประกอบเดียว (เช่น ฟังก์ชัน ReLU พื้นฐานบนเมทริกซ์) การดำเนินการเหล่านี้เป็น ขึ้นอยู่กับหน่วยความจำ เพราะว่าจีพียูใช้เวลานานในการถ่ายโอนข้อมูลจากหน่วยความจำไฮเปอร์ (HBM) ไปยังเรจิสเตอร์ มากกว่าการดำเนินการทางคณิตศาสตร์

1. ทำไม GEMM จึงสำคัญ

การคูณเมทริกซ์ทั่วไป (GEMM) มีความซับซ้อนด้านการคำนวณเป็น $O(N^3)$ แต่ต้องการการเข้าถึงหน่วยความจำเพียง $O(N^2)$ เท่านั้น ทำให้เราสามารถซ่อนเวลาหน่วงการเข้าถึงหน่วยความจำไว้เบื้องหลังอัตราการประมวลผลทางคณิตศาสตร์ที่สูงมาก จึงกลายเป็น 'หัวใจ' ของโมเดลภาษาขนาดใหญ่ (LLMs)

2. การแสดงหน่วยความจำแบบสองมิติ

หน่วยความจำฟิสิกส์เป็นแบบหนึ่งมิติ เพื่อแสดงเทนเซอร์สองมิติ เราจึงใช้ สตรายด์. ปัญหาที่พบบ่อยในงานผลิตคือ การสมมุติว่าเทนเซอร์เป็นต่อเนื่อง. หากคุณสับสนระหว่างสตรายด์แถวและสตรายด์คอลัมน์ในการคำนวณพอยน์เตอร์ คุณจะเข้าถึงข้อมูล 'ลับ' หรือกระตุ้นให้เกิดข้อผิดพลาดด้านหน่วยความจำ

3. การขยายแนวคิดแบบแบ่งเป็นช่อง

Triton ขยายตรรกะการดำเนินการแบบองค์ประกอบเดียว โดยเปลี่ยนจากการใช้ พอยน์เตอร์เดี่ยว ไปเป็น กลุ่มพอยน์เตอร์. โดยการใช้ช่องแบบสองมิติ (เช่น $16 \times 16$) เราจะใช้ประโยชน์จาก การนำข้อมูลมาใช้ซ้ำ ในหน่วยความจำ SRAM ความเร็วสูง ทำให้ข้อมูลยังคง 'ร้อน' สำหรับการทำงานรวม เช่น การเพิ่มเบียส หรือการกระตุ้น (activation) ก่อนเขียนกลับไปยังหน่วยความจำหลัก (Global Memory)

การจัดเรียงแบบเส้นตรงหนึ่งมิติการจัดเรียงแบบแบ่งเป็นช่องสองมิติ
main.py
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>